Como o avanço da ciência de dados foi possível colecionar um conjunto de boas praticas que evitam problemas futuros no armazenamento e processamento dos dados nos bancos de dados. Esses problemas vão desde a redundância de dados ( o mesmo dado em diversas tabelas ou em campos distintos ), dispersão dos dados ( os dados de um item espalhados em diversas tabelas), descasamento dos dados ( por exemplo uma venda sem um cliente ou preço de venda corretos) entre muitos erros possíveis num banco de dados.
Chamamos esses 'erros' de anomalias ou inconsitências. Anomalias são os erros onde o dado não tem pé nem cabeça, por exemplo, num campo onde deveria haver o nome de uma pessoa tem uma cor de um carro. Inconsistências seriam quando uma tabela tem um dado apontando para uma outra tabela e indo na outra tabela não temos qualquer correspondência com o dado apontado pela primeira tabela.
Para entender as formas normais precisamos enter os conceitos de :
1-Dependência Funcional
2-Dependência Funcional Parcial
3-Dependência Funcional Transitiva
4-Atributos Multivalorados
5-Atributos Compostos
A coisa parece complicada, mas não é não.
A dependência funcional ocorre quando um campo / coluna de uma tabela esta diretamente relacionado a outro campo / coluna da mesma tabela.Por exemplo, numa tabela de clientes temos 2 campos : Nome e CPF. É claro que para um cliente o Nome está casado com o seu CPF, ou seja, não é possível que outro cliente tenha o mesmo CPF ou mesmo que o mesmo CPF pertença a dois ou mais clientes. Digamos que esse 'casamento' entre os campos é inerente a 'entidade' que ele representa. Nesta dependência digamos que existe uma 'cola' entre os campos porque eles representam uma 'entidade' única de forma exclusiva.
É quando a dependência funcional não é diretamente ligada a entidade dona da tabela. Digamos que a entidade dona da tabela aponta para um item e um outro item com dependência parcial depende não da entidade dona da tabela mas sim desse 'atributo' determinado pela entidade dona da tabela.
Citando um exemplo : O boletim de notas de um aluno. Ele tem 5 campos :
1-Número do Aluno
2-Período que o aluno estuda
3-Código da Matéria
4-Nome da matéria
5-Nota.
Os campos '1-Número do Aluno', '2-Período que o aluno estuda' estão ligados diretamente a entidade dona do boletim : O aluno.
Contudo os campos 3-Código da matéria e 4-Nome da matéria não pertencem ao aluno mas sim ao curso que ele está fazendo.
Digamos que existe uma 'ligação indireta' entre o aluno e a matéria porque o aluno está cursando aulas com determinadas
matérias. Isto seria uma dependência Funcional Parcial. O mesmo ocorre com o campo 5-Nota. Ele não está ligado diretamente
ao aluno mas sim ao seu rendimento na prova daquele período de tempo apenas ( bimestre por exemplo ).
Este tipo de dependência ocorre quando o campo de uma tabela A está casado com o campo da tabela B sendo que nem o campo A nem o campo B são chaves primárias ( únicas - identificados de um registro único ) da tabela. Sendo assim não teremos um relacionamento direto, um-para-um ou um-para-muitos mas sim muitos-para-muitos. Neste tipo de dependência, num join de tabelas faria com que o mesmo dado de uma tabela A seja repetido n vezes dependendo de quantas vezes repete o campo 'correspondente' na tabela B. Tecnicamente esta dependência causa a repetição de um item num campo de uma tabela. Vamos supor que numa tabela de funcionários tivéssemos o 'código do cargo' e a 'descrição do cargo' em uma tabela que não seja a de cargos. Isto faria com que o campo 'descrição do cargo' repetisse o mesmo conteúdo inúmeras vezes desnecessariamente já que o campo 'código do cargo' seria o suficiente para chegarmos até a descrição do cargo.